{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "reverse-interview",
   "metadata": {},
   "source": [
    "# Vector Operations: Scalar Multiplication, Sum and Dot Product of Vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "parental-conclusion",
   "metadata": {},
   "source": [
    "In this lab you will use Python and `NumPy` functions to perform main vector operations: scalar multiplication, sum of vectors and their dot product. You will also investigate the speed of calculations using loop and vectorized forms of these main linear algebra operations"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "looking-barcelona",
   "metadata": {},
   "source": [
    "# Table of Contents\n",
    "- [ 1 - Scalar Multiplication and Sum of Vectors](#1)\n",
    "  - [ 1.1 - Visualization of a Vector $v\\in\\mathbb{R}^2$](#1.1)\n",
    "  - [ 1.2 - Scalar Multiplication](#1.2)\n",
    "  - [ 1.3 - Sum of Vectors](#1.3)\n",
    "  - [ 1.4 - Norm of a Vector](#1.4)\n",
    "- [ 2 - Dot Product](#2)\n",
    "  - [ 2.1 - Algebraic Definition of the Dot Product](#2.1)\n",
    "  - [ 2.2 - Dot Product using Python](#2.2)\n",
    "  - [ 2.3 - Speed of Calculations in Vectorized Form](#2.3)\n",
    "  - [ 2.4 - Geometric Definition of the Dot Product](#2.4)\n",
    "  - [ 2.5 - Application of the Dot Product: Vector Similarity](#2.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "advance-butler",
   "metadata": {},
   "source": [
    "## Packages\n",
    "\n",
    "Load the `NumPy` package to access its functions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "promotional-buffer",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "severe-studio",
   "metadata": {},
   "source": [
    "<a name='1'></a>\n",
    "## 1 - Scalar Multiplication and Sum of Vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ethical-success",
   "metadata": {},
   "source": [
    "<a name='1.1'></a>\n",
    "### 1.1 - Visualization of a Vector $v\\in\\mathbb{R}^2$\n",
    "\n",
    "You already have seen in the videos and labs, that vectors can be visualized as arrows, and it is easy to do it for a $v\\in\\mathbb{R}^2$, e.g.\n",
    "$v=\\begin{bmatrix}\n",
    "          1 & 3\n",
    "\\end{bmatrix}^T$\n",
    "\n",
    "The following code will show the visualization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "korean-landing",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def plot_vectors(list_v, list_label, list_color):\n",
    "    _, ax = plt.subplots(figsize=(10, 10))\n",
    "    ax.tick_params(axis='x', labelsize=14)\n",
    "    ax.tick_params(axis='y', labelsize=14)\n",
    "    ax.set_xticks(np.arange(-10, 10))\n",
    "    ax.set_yticks(np.arange(-10, 10))\n",
    "    \n",
    "    \n",
    "    plt.axis([-10, 10, -10, 10])\n",
    "    for i, v in enumerate(list_v):\n",
    "        sgn = 0.4 * np.array([[1] if i==0 else [i] for i in np.sign(v)])\n",
    "        plt.quiver(v[0], v[1], color=list_color[i], angles='xy', scale_units='xy', scale=1)\n",
    "        ax.text(v[0]-0.2+sgn[0], v[1]-0.2+sgn[1], list_label[i], fontsize=14, color=list_color[i])\n",
    "\n",
    "    plt.grid()\n",
    "    plt.gca().set_aspect(\"equal\")\n",
    "    plt.show()\n",
    "\n",
    "v = np.array([[1],[3]])\n",
    "# Arguments: list of vectors as NumPy arrays, labels, colors.\n",
    "plot_vectors([v], [f\"$v$\"], [\"black\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "original-translator",
   "metadata": {},
   "source": [
    "The vector is defined by its **norm (length, magnitude)** and **direction**, not its actual position. But for clarity and convenience vectors are often plotted starting in the origin (in $\\mathbb{R}^2$ it is a point $(0,0)$) ."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "speaking-surgeon",
   "metadata": {},
   "source": [
    "<a name='1.2'></a>\n",
    "### 1.2 - Scalar Multiplication\n",
    "\n",
    "**Scalar multiplication** of a vector $v=\\begin{bmatrix}\n",
    "          v_1 & v_2 & \\ldots & v_n \n",
    "\\end{bmatrix}^T\\in\\mathbb{R}^n$ by a scalar $k$ is a vector $kv=\\begin{bmatrix}\n",
    "          kv_1 & kv_2 & \\ldots & kv_n \n",
    "\\end{bmatrix}^T$ (element by element multiplication). If $k>0$, then $kv$ is a vector pointing in the same direction as $v$ and it is $k$ times as long as $v$. If $k=0$, then $kv$ is a zero vector. If $k<0$, vector $kv$ will be pointing in the opposite direction. In Python you can perform this operation with a `*` operator. Check out the example below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "acute-investment",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_vectors([v, 2*v, -2*v], [f\"$v$\", f\"$2v$\", f\"$-2v$\"], [\"black\", \"green\", \"blue\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "civil-county",
   "metadata": {},
   "source": [
    "<a name='1.3'></a>\n",
    "### 1.3 - Sum of Vectors\n",
    "\n",
    "**Sum of vectors (vector addition)** can be performed by adding the corresponding components of the vectors: if $v=\\begin{bmatrix}\n",
    "          v_1 & v_2 & \\ldots & v_n \n",
    "\\end{bmatrix}^T\\in\\mathbb{R}^n$ and  \n",
    "$w=\\begin{bmatrix}\n",
    "          w_1 & w_2 & \\ldots & w_n \n",
    "\\end{bmatrix}^T\\in\\mathbb{R}^n$, then $v + w=\\begin{bmatrix}\n",
    "          v_1 + w_1 & v_2 + w_2 & \\ldots & v_n + w_n \n",
    "\\end{bmatrix}^T\\in\\mathbb{R}^n$. The so-called **parallelogram law** gives the rule for vector addition. For two vectors $u$ and $v$ represented by the adjacent sides (both in magnitude and direction) of a parallelogram drawn from a point, the vector sum $u+v$ is is represented by the diagonal of the parallelogram drawn from the same point:\n",
    "\n",
    "<img src = \"images/sum_of_vectors.png\" width=\"230\" align=\"middle\"/>\n",
    "\n",
    "In Python you can either use `+` operator or `NumPy` function `np.add()`. In the following code you can uncomment the line to check that the result will be the same:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "acoustic-heath",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "v = np.array([[1],[3]])\n",
    "w = np.array([[4],[-1]])\n",
    "\n",
    "plot_vectors([v, w, v + w], [f\"$v$\", f\"$w$\", f\"$v + w$\"], [\"black\", \"black\", \"red\"])\n",
    "# plot_vectors([v, w, np.add(v, w)], [f\"$v$\", f\"$w$\", f\"$v + w$\"], [\"black\", \"black\", \"red\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "nearby-portal",
   "metadata": {},
   "source": [
    "<a name='1.4'></a>\n",
    "### 1.4 - Norm of a Vector\n",
    "\n",
    "The norm of a vector $v$ is denoted as $\\lvert v\\rvert$. It is a nonnegative number that describes the extent of the vector in space (its length). The norm of a vector can be found using `NumPy` function `np.linalg.norm()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "spare-timing",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Norm of a vector v is 3.1622776601683795\n"
     ]
    }
   ],
   "source": [
    "print(\"Norm of a vector v is\", np.linalg.norm(v))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "talented-survey",
   "metadata": {},
   "source": [
    "<a name='2'></a>\n",
    "## 2 - Dot Product"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sunset-transmission",
   "metadata": {},
   "source": [
    "<a name='2.1'></a>\n",
    "### 2.1 - Algebraic Definition of the Dot Product\n",
    "\n",
    "The **dot product** (or **scalar product**) is an algebraic operation that takes two vectors $x=\\begin{bmatrix}\n",
    "          x_1 & x_2 & \\ldots & x_n \n",
    "\\end{bmatrix}^T\\in\\mathbb{R}^n$ and  \n",
    "$y=\\begin{bmatrix}\n",
    "          y_1 & y_2 & \\ldots & y_n \n",
    "\\end{bmatrix}^T\\in\\mathbb{R}^n$ and returns a single scalar. The dot product can be represented with a dot operator $x\\cdot y$ and defined as:\n",
    "\n",
    "$$x\\cdot y = \\sum_{i=1}^{n} x_iy_i = x_1y_1+x_2y_2+\\ldots+x_ny_n \\tag{1}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "meaningful-timer",
   "metadata": {},
   "source": [
    "<a name='2.2'></a>\n",
    "### 2.2 - Dot Product using Python\n",
    "\n",
    "The simplest way to calculate dot product in Python is to take the sum of element by element multiplications. You can define the vectors $x$ and $y$ by listing their coordinates:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "musical-battlefield",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = [1, -2, -5]\n",
    "y = [4, 3, -1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "plastic-temple",
   "metadata": {},
   "source": [
    "Next, let’s define a function `dot(x,y)` for the dot product calculation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "signed-syndicate",
   "metadata": {},
   "outputs": [],
   "source": [
    "def dot(x, y):\n",
    "    s=0\n",
    "    for xi, yi in zip(x, y):\n",
    "        s += xi * yi\n",
    "    return s"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "upper-highlight",
   "metadata": {},
   "source": [
    "For the sake of simplicity, let’s assume that the vectors passed to the above function are always of the same size, so that you don’t need to perform additional checks.\n",
    "\n",
    "Now everything is ready to perform the dot product calculation calling the function `dot(x,y)`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "amazing-broadway",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The dot product of x and y is 3\n"
     ]
    }
   ],
   "source": [
    "print(\"The dot product of x and y is\", dot(x, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "banned-dallas",
   "metadata": {},
   "source": [
    "Dot product is very a commonly used operator, so `NumPy` linear algebra package provides quick way to calculate it using function `np.dot()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "accessible-kinase",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "np.dot(x,y) function returns dot product of x and y: 3\n"
     ]
    }
   ],
   "source": [
    "print(\"np.dot(x,y) function returns dot product of x and y:\", np.dot(x, y)) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "friendly-beast",
   "metadata": {},
   "source": [
    "Note that you did not have to define vectors $x$ and $y$ as `NumPy` arrays, the function worked even with the lists. But there are alternative functions in Python, such as explicit operator `@` for the dot product, which can be applied only to the `NumPy` arrays. You can run the following cell to check that."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "built-paper",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "This line output is a dot product of x and y:  3\n",
      "\n",
      "This line output is an error:\n",
      "unsupported operand type(s) for @: 'list' and 'list'\n"
     ]
    }
   ],
   "source": [
    "print(\"This line output is a dot product of x and y: \", np.array(x) @ np.array(y))\n",
    "\n",
    "print(\"\\nThis line output is an error:\")\n",
    "try:\n",
    "    print(x @ y)\n",
    "except TypeError as err:\n",
    "    print(err)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "central-museum",
   "metadata": {},
   "source": [
    "As both `np.dot()` and `@` operators are commonly used, it is recommended to define vectors as `NumPy` arrays to avoid errors. Let's redefine vectors $x$ and $y$ as `NumPy` arrays to be safe:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "israeli-jumping",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array(x)\n",
    "y = np.array(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "wicked-queensland",
   "metadata": {},
   "source": [
    "<a name='2.3'></a>\n",
    "### 2.3 - Speed of Calculations in Vectorized Form\n",
    "\n",
    "Dot product operations in Machine Learning applications are applied to the large vectors with hundreds or thousands of coordinates (called **high dimensional vectors**). Training models based on large datasets often takes hours and days even on powerful machines. Speed of calculations is crucial for the training and deployment of your models. \n",
    "\n",
    "It is important to understand the difference in the speed of calculations using vectorized and the loop forms of the vectors and functions. In the loop form operations are performed one by one, while in the vectorized form they can be performed in parallel. In the section above you defined loop version of the dot product calculation (function `dot()`), while `np.dot()` and `@` are the functions representing vectorized form.\n",
    "\n",
    "Let's perform a simple experiment to compare their speed. Define new vectors $a$ and $b$ of the same size $1,000,000$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "amino-creation",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.random.rand(1000000)\n",
    "b = np.random.rand(1000000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "facial-refrigerator",
   "metadata": {},
   "source": [
    "Use `time.time()` function to evaluate amount of time (in seconds) required to calculate dot product using the function `dot(x,y)` which you defined above: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "handed-influence",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dot product:  249807.52357347292\n",
      "Time for the loop version:593.7082767486572 ms\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "tic = time.time()\n",
    "c = dot(a,b)\n",
    "toc = time.time()\n",
    "print(\"Dot product: \", c)\n",
    "print (\"Time for the loop version:\" + str(1000*(toc-tic)) + \" ms\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "accessible-sherman",
   "metadata": {},
   "source": [
    "Now compare it with the speed of the vectorized versions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "determined-cooking",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dot product:  249807.52357347292\n",
      "Time for the vectorized version, np.dot() function: 2.61688232421875 ms\n"
     ]
    }
   ],
   "source": [
    "tic = time.time()\n",
    "c = np.dot(a,b)\n",
    "toc = time.time()\n",
    "print(\"Dot product: \", c)\n",
    "print (\"Time for the vectorized version, np.dot() function: \" + str(1000*(toc-tic)) + \" ms\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "scientific-empty",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dot product:  249807.52357347292\n",
      "Time for the vectorized version, @ function: 1.676321029663086 ms\n"
     ]
    }
   ],
   "source": [
    "tic = time.time()\n",
    "c = a @ b\n",
    "toc = time.time()\n",
    "print(\"Dot product: \", c)\n",
    "print (\"Time for the vectorized version, @ function: \" + str(1000*(toc-tic)) + \" ms\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "useful-sleeping",
   "metadata": {},
   "source": [
    "You can see that vectorization is extremely beneficial in terms of the speed of calculations!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "postal-latin",
   "metadata": {},
   "source": [
    "<a name='2.4'></a>\n",
    "### 2.4 - Geometric Definition of the Dot Product\n",
    "\n",
    "In [Euclidean space](https://en.wikipedia.org/wiki/Euclidean_space), a Euclidean vector has both magnitude and direction. The dot product of two vectors $x$ and $y$ is defined by:\n",
    "\n",
    "$$x\\cdot y = \\lvert x\\rvert \\lvert y\\rvert \\cos(\\theta),\\tag{2}$$\n",
    "\n",
    "where $\\theta$ is the angle between the two vectors:\n",
    "\n",
    "<img src = \"images/dot_product_geometric.png\" width=\"230\" align=\"middle\"/>\n",
    "\n",
    "This provides an easy way to test the orthogonality between vectors. If $x$ and $y$ are orthogonal (the angle between vectors is $90^{\\circ}$), then since $\\cos(90^{\\circ})=0$, it implies that **the dot product of any two orthogonal vectors must be $0$**. Let's test it, taking two vectors $i$ and $j$ we know are orthogonal:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "shared-climb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The dot product of i and j is 0\n"
     ]
    }
   ],
   "source": [
    "i = np.array([1, 0, 0])\n",
    "j = np.array([0, 1, 0])\n",
    "print(\"The dot product of i and j is\", dot(i, j))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "thermal-railway",
   "metadata": {},
   "source": [
    "<a name='2.5'></a>\n",
    "### 2.5 - Application of the Dot Product: Vector Similarity\n",
    "\n",
    "Geometric definition of a dot product is used in one of the applications - to evaluate **vector similarity**. In Natural Language Processing (NLP) words or phrases from vocabulary are mapped to a corresponding vector of real numbers. Similarity between two vectors can be defined as a cosine of the angle between them. When they point in the same direction, their similarity is 1 and it decreases with the increase of the angle. \n",
    "\n",
    "Then equation $(2)$ can be rearranged to evaluate cosine of the angle between vectors:\n",
    "\n",
    "$\\cos(\\theta)=\\frac{x \\cdot y}{\\lvert x\\rvert \\lvert y\\rvert}.\\tag{3}$\n",
    "\n",
    "Zero value corresponds to the zero similarity between vectors (and words corresponding to those vectors). Largest value is when vectors point in the same direction, lowest value is when vectors point in the opposite directions.\n",
    "\n",
    "This example of vector similarity is given to link the material with the Machine Learning applications. There will be no actual implementation of it in this Course. Some examples of implementation can be found in the Natual Language Processing Specialization.\n",
    "\n",
    "Well done, you have finished this lab!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "collect-needle",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
